Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Backend для JsHttpRequest на языке Go :) (Юрий Насретдинов, оценка: 1)
Author Message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Tue Aug 17, 2010 5:51 pm (написано за 11 минут 53 секунды)
   Post subject: Backend для JsHttpRequest на языке Go :)
Reply with quote

Какое-то время назад Google представила свой язык, который называется Go (golang.org/). Разработчиками языка, без шуток, являются вполне серьёзные люди, принимавшие участие в том числе и в разработке до сих пор популярного языка Си.

Я решил для интереса написать backend для JsHttpRequest на языке Go (он приложен отдельным файлом).

API у него довольно простой — он ожидает на вход параметры c *http.Conn, req *http.Request стандартного пакета http, который, в дополнение, реализует встроенный веб-сервер.

Работать с ним примерно так (разукрашенная версия (paste.pocoo.org/show/251607/)):
Code (any language): скопировать код в буфер обмена
import "./jshttprequest"

...

// где-то в main, перед http.ListenAndServe
http.HandleFunc("/ajax", JSHttpRequestHandler)

...

func JSHttpRequestHandler(c *http.Conn, req *http.Request) {
        // инициализация библиотеки + обработка ошибок инициализации (для упрощения отладки, чисто в принципе jshr_err можно проигнорировать)

        jshr_inst, jshr_err := jshttprequest.New(c, req)

        if jshr_err != nil {

                jshr_inst.Errors = fmt.Sprintf("JsHttpRequest library error: %v\nOther errors: %s", jshr_err, jshr_inst.Errors)
                jshr_inst.Send()
                return

        }

        // обязательно нужно написать именно defer jshr_inst.Send() — к сожалению, я не нашел возможности самой библиотеке этот обработчик повесить :)
        defer jshr_inst.Send()

        /*
        ...
       
        ваш код

        в случае panic'а отложенный вызов jshr_inst.Send() сработает, сам вызовет recover() и отправит сообщение об ошибке в виде правильного JsHttpRequest-ответа.
        Ваше приложение не упадет :)
       
        ...
        */
       
        jshr_inst.Errors = "Строка со своими ошибками, если хочется (по умолчанию пустая)"
        jshr_inst.Response = /* аналог _RESULT, имеет тип interface{}, так что сюда можно записывать всё, что угодно, лишь бы json.Marshal() это понимало */;
       
        // Send() вызывать не надо, т.к. вызов Send() должен вызываться в начале как defer
}

...
В качестве примера приведен простенький веб-сервер, который выполняет функции а-ля PhpMyAdmin, но только позволяет просматривать таблицы


jshttprequest.go.zip
 Description:
Только библиотека (самая новая версия лежит здесь!)

Download
 Filename:  jshttprequest.go.zip
 Filesize:  4.16 KB
 Downloaded:  490 Time(s)


go-mysql.zip
 Description:
Библиотека mysql, которая используется в примере

Download
 Filename:  go-mysql.zip
 Filesize:  779.44 KB
 Downloaded:  457 Time(s)


jshr_go.zip
 Description:
Пример использования (включает в себя старую версию библиотеки)

Download
 Filename:  jshr_go.zip
 Filesize:  43.65 KB
 Downloaded:  447 Time(s)



Last edited by Юрий Насретдинов on Wed Aug 18, 2010 3:49 pm; edited 6 times in total
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Tue Aug 17, 2010 5:59 pm (спустя 7 минут; написано за 4 минуты 40 секунд)
   Post subject:
Reply with quote

Вот замеры производительности обработки пришедшего запроса на моём ноутбуке (здесь важно, что у меня 64-битная ОС):

Время обработки маленькой структуры:
Code (any language): скопировать код в буфер обмена
{ 'table': 'customs', 'length': 50, 'start': 0 }
PHP: 0.0007 sec
Go: 0.00002 sec


Время обработки структуры побольше:
Code (any language): скопировать код в буфер обмена
{ 'table': 'customs', 'length': 50, 'start': 0, 'long_text': '... 250 кб юникодового текста ...' }
PHP: 1.25 sec
Go: 0.042 sec


Я думаю, имеет смысл присмотреться к этому языку, потому что он реально очень быстрый (сравнимо с Си), имеет встроенный сборщик мусора, непробиваемый стек и т.д.

Last edited by Юрий Насретдинов on Tue Aug 17, 2010 6:58 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Tue Aug 17, 2010 6:09 pm (спустя 9 минут; написано за 54 секунды)
   Post subject:
Reply with quote

Юрий Насретдинов,
интересное решение (будет повод познакомится с Golang (-; ) [+]

М

Правом модератора, данным мне в этом форуме -- надбавил теме балл. (-;


Last edited by Александр Михалицын on Wed Aug 18, 2010 2:59 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Tue Aug 17, 2010 6:40 pm (спустя 31 минуту; написано за )
   Post subject:
Reply with quote

Да, и еще одна вещь: переданные данные доступны в виде свойства Request map[string][]string. Передача многомерных структур в backend поддерживается только при ручном кодировании в json на стороне клиента и декодировании уже на стороне backend'а с помощью packag'а json. Ну, и, традиционно, загрузчик form.POST не поддерживается (включая загрузку файлов) — если нужно загружать файлы, используйте PHP backend, там это намного удобнее и достаточно быстро.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Wed Aug 18, 2010 2:51 pm (спустя 20 часов 11 минут; написано за 35 секунд)
   Post subject:
Reply with quote

Добавил поддержку multipart/form-data, но без аплоада файлов — я настаиваю, что PHP в этом случае подошел бы намного лучше :)
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

Но если не поверите и все же попытаетесь - как только увидите, что все безрезультатно, удалите свой пост, пожалуйста. Модераторы тоже люди, нехорошо, если они погрязнут в тоннах спама.
     

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML